package aplicacion;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;

import servicio.MigrarPaquetes;
import utilidades.BarraProgreso;
import utilidades.DatePicker;
import utilidades.Validador;
import dominio.Aeropuerto;
import dominio.Direccion;
import dominio.Hotel;
import dominio.Avion;
import dominio.PaqueteDeViaje;
import net.miginfocom.swing.MigLayout;

@SuppressWarnings("serial")
public class MenuPaquete extends JPanel{
	private JPanel panelIzquierda;
	private JPanel panelCentro;
	private JPanel panelArriba;
	private JTextField txtTxtbuscar;
	private JTable table;

	MenuPaquete(final MenuPrincipal menuPrincipal){
		setLayout( new BorderLayout() );
		cargarPanelArriba();
		cargarPanelIzquierda(menuPrincipal);
		cargarPanelCentro();
	}
	
	public void cargarPanelArriba(){
		panelArriba = new JPanel();
		panelArriba.setLayout(new MigLayout("", "[grow][]", "[]"));
		
		txtTxtbuscar = new JTextField();
		txtTxtbuscar.setPreferredSize(new Dimension(4, 25));
		panelArriba.add(txtTxtbuscar, "cell 0 0,growx");
		txtTxtbuscar.setColumns(10);
		{
			JButton btbBuscar = new JButton("Buscar");
			btbBuscar.setIcon(new ImageIcon(MenuCliente.class.getResource("/aplicacion/imagenes/buscar.png")));
			panelArriba.add(btbBuscar, "cell 1 0,alignx right");
			
		}
		add(panelArriba, BorderLayout.NORTH);
	}
	
	public void cargarPanelIzquierda(final MenuPrincipal menuPrincipal){
		panelIzquierda = new JPanel();
		panelIzquierda.setLayout(new MigLayout());
		{
			JButton btbAgregar = new JButton("Agregar");
			btbAgregar.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent arg0) {
					MenuAgregarPaquete menuAgregarPaquete = new MenuAgregarPaquete(menuPrincipal);
					menuAgregarPaquete.setVisible(true);
					menuPrincipal.menuPaquete.remove(panelCentro);
					menuPrincipal.menuPaquete.cargarPanelCentro();
					menuPrincipal.menuPaquete.panelCentro.revalidate();
					menuPrincipal.menuPaquete.panelCentro.repaint();
				}
			});
			btbAgregar.setIconTextGap(12);
			btbAgregar.setHorizontalAlignment(SwingConstants.LEFT);
			btbAgregar.setHorizontalTextPosition(SwingConstants.LEFT);
			btbAgregar.setIcon(new ImageIcon(MenuCliente.class.getResource("/aplicacion/imagenes/agregar_paquete.png")));
			panelIzquierda.add(btbAgregar, "cell 0 0,growx,aligny top");
			
			JButton btbModificar = new JButton("Modificar");
			btbModificar.setHorizontalAlignment(SwingConstants.LEFT);
			btbModificar.setHorizontalTextPosition(SwingConstants.LEFT);
			btbModificar.setIcon(new ImageIcon(MenuCliente.class.getResource("/aplicacion/imagenes/modificar_cliente.png")));
			panelIzquierda.add(btbModificar, "cell 0 1,alignx left,growy");

			JButton btbEliminar = new JButton("Eliminar");
			btbEliminar.setIconTextGap(12);
			btbEliminar.setHorizontalAlignment(SwingConstants.LEFT);
			btbEliminar.setHorizontalTextPosition(SwingConstants.LEFT);
			btbEliminar.setIcon(new ImageIcon(MenuCliente.class.getResource("/aplicacion/imagenes/borrar_paquete.png")));
			panelIzquierda.add(btbEliminar, "cell 0 2,grow");
			
			final JButton btbMigrar = new JButton("Importar");
			btbMigrar.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent arg0) {
					Thread TmigrarPaquetes = new Thread() {
						public void run() {
							migrarPaquetes(menuPrincipal, btbMigrar);
						}
					};
					TmigrarPaquetes.start();
				}
			});
			btbMigrar.setIconTextGap(8);
			btbMigrar.setHorizontalAlignment(SwingConstants.LEFT);
			btbMigrar.setHorizontalTextPosition(SwingConstants.LEFT);
			btbMigrar.setIcon(new ImageIcon(MenuPaquete.class.getResource("/aplicacion/imagenes/db.png")));
			panelIzquierda.add(btbMigrar, "cell 0 3,grow");
		}	
		add(panelIzquierda, BorderLayout.WEST);
	}
	
	public void cargarPanelCentro(){
		panelCentro = new JPanel();
		panelCentro.setLayout( new GridLayout() );
		add(panelCentro, BorderLayout.CENTER);
		String[] columnNames = {"ID Viaje","Aeropuerto Salida","Fecha Salida",
				"Aeropuerto Arrivo","Fecha Arrivo","Hotel","Avion","Precio",};
		table = new JTable(new DefaultTableModel(null, columnNames){
		    public boolean isCellEditable(int row, int column)
		    {
		      return false;//para que no se puedan editar las celdas
		    }
		});
		try {
			agregarFilas();
		} catch (Exception e) {
			e.printStackTrace();
		}
		JScrollPane scrollPane = new JScrollPane(table);
		panelCentro.add(scrollPane);		
	}
	
	void agregarFilas() throws ClassNotFoundException, IOException{
		List<PaqueteDeViaje> lista = new ArrayList<PaqueteDeViaje>();
		lista = new PaqueteDeViaje().leerRegistros();
		DefaultTableModel defaultModel = (DefaultTableModel) table.getModel(); 
		for (PaqueteDeViaje p : lista){
			defaultModel.addRow(new Object[]{ p.getIdPaquete().toString(),
					p.getAeropuertoSalida().toString(),
					p.getFechaSalida().toString() + " " +
					p.getHoraSalida().toString(),
					p.getAuropuertaArrivo().toString(),
					p.getFechaArrivo().toString() + " " +
					p.getHoraArrivo().toString(),
					p.getHotel(),
					p.getAvion(),
					p.getPrecio(),
					});
		}
	    table = new JTable(defaultModel);    
	}
	
	private void migrarPaquetes(final MenuPrincipal menuPrincipal, final JButton btbMigrar){
		Thread migrarPaquetes = new Thread(new MigrarPaquetes());
		migrarPaquetes.start();
		Thread barraProgreso = new Thread(new BarraProgreso(menuPrincipal));
		barraProgreso.start();
		while(migrarPaquetes.isAlive()){
			btbMigrar.setEnabled(false);
		}
		btbMigrar.setEnabled(true);
        remove(panelCentro);
		cargarPanelCentro();
		panelCentro.revalidate();
		panelCentro.repaint();
	}

	public JPanel getPanel() {
		return this;
	}

}

@SuppressWarnings("serial")
class MenuAgregarPaquete extends JDialog {
//	private JTextField txtIdViaje;
	private JTextField txtFechaIda;
	private JTextField txtFechaVuelta;
	private JTextField txtHoraSalida;
	private JTextField txtHoraLlegada;
	private JComboBox cbxAeropuertoOrigen;
	private JComboBox cbxAeropuertoDestino;
	private JComboBox cbxHotel;
	private JComboBox cbxAvion;
	private JTextField txtPrecio;
	
	MenuAgregarPaquete(final MenuPrincipal menuPrincipal){
		super(menuPrincipal,true);
		setSize(400, 350);
		setTitle("Agregar paquete");
		setLocationRelativeTo(menuPrincipal);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		getContentPane().setLayout(new MigLayout());
		try {
			cargarCombobox();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		
//		JLabel lblIdViaje = new JLabel("ID Viaje:");
//		txtIdViaje = new JTextField();
//		txtIdViaje.setMinimumSize(new Dimension(200,25));
//		add(lblIdViaje, "cell 0 0");
//		add(txtIdViaje, "cell 1 0, growx");		
		
		JLabel lblNombreAeropuertoOrigen = new JLabel("Aeropuerto Origen:");
		cbxAeropuertoOrigen.setMinimumSize(new Dimension(190,20));
		add(cbxAeropuertoOrigen, "cell 1 4, growx");
		add(lblNombreAeropuertoOrigen, "cell 0 4");
	
		JLabel lblNombreAeropuertoDestino = new JLabel("Aeropuerto Destino:");
		cbxAeropuertoDestino.setMinimumSize(new Dimension(190,20));
		add(cbxAeropuertoDestino, "cell 1 8, growx");
		add(lblNombreAeropuertoDestino, "cell 0 8");
		
		JLabel lblFechaIda = new JLabel("Fecha Ida:");
		JButton btbFechaIda = new JButton("...");
		txtFechaIda = new JTextField();
		txtFechaIda.setText("dd/mm/aaaa");
		txtFechaIda.setMinimumSize(new Dimension(50,25));
		btbFechaIda.setMaximumSize(new Dimension(20,25));
		btbFechaIda.setMinimumSize(new Dimension(20,25));
		btbFechaIda.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				DatePicker dp = new DatePicker(menuPrincipal);
				txtFechaIda.setText(dp.setPickedDate());
			}
		});
		add(lblFechaIda, "cell 0 9");
		add(txtFechaIda, "cell 1 9, growx");
		add(btbFechaIda, "cell 1 9");
		
		JLabel lblHoraSalida = new JLabel("Hora Ida:");
		txtHoraSalida = new JTextField();
		txtHoraSalida.setText("hh:mm");
		txtHoraSalida.setMinimumSize(new Dimension(50,25));
		add(lblHoraSalida, "cell 0 10");
		add(txtHoraSalida, "cell 1 10, growx");

		
		JLabel lblFechaVuelta = new JLabel("Fecha Vuelta:");
		JButton btbFechaVuelta = new JButton("...");
		txtFechaVuelta = new JTextField();
		txtFechaVuelta.setText("dd/mm/aaaa");
		txtFechaVuelta.setMinimumSize(new Dimension(50,25));
		btbFechaVuelta.setMaximumSize(new Dimension(20,25));
		btbFechaVuelta.setMinimumSize(new Dimension(20,25));
		btbFechaVuelta.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				DatePicker dp = new DatePicker(menuPrincipal);
				txtFechaVuelta.setText(dp.setPickedDate());
			}
		});
		add(lblFechaVuelta, "cell 0 11");
		add(txtFechaVuelta, "cell 1 11, growx");
		add(btbFechaVuelta, "cell 1 11");
		
		JLabel lblHoraLlegada = new JLabel("Hora Vuelta:");	
		txtHoraLlegada = new JTextField();
		txtHoraLlegada.setText("hh:mm");
		txtHoraLlegada.setMinimumSize(new Dimension(50,25));
		add(lblHoraLlegada, "cell 0 12");
		add(txtHoraLlegada, "cell 1 12, growx");
		
		JLabel lblHotel = new JLabel("Hotel:");
		cbxHotel.setMinimumSize(new Dimension(190,20));
		add(lblHotel, "cell 0 13");
		add(cbxHotel, "cell 1 13, growx");	
		
		JLabel lblAvion = new JLabel("Avion:");
		cbxAvion.setMinimumSize(new Dimension(190,20));
		add(lblAvion, "cell 0 14");
		add(cbxAvion, "cell 1 14, growx");
		
		JLabel lblPrecio = new JLabel("Precio:");
		txtPrecio = new JTextField();
		txtPrecio.setMinimumSize(new Dimension(50,25));
		add(lblPrecio, "cell 0 15");
		add(txtPrecio, "cell 1 15, growx");
	
		JButton btbAgregar = new JButton("Agregar");
		btbAgregar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if(validarPaquete()){
					try {
						guardarPaquete();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		});
		add(btbAgregar, "cell 1 16, growx");
		pack();
		setResizable(false);
	}
	
	void cargarCombobox() throws SQLException{
		List<Aeropuerto> listaAeropuerto = new ArrayList<Aeropuerto>();
		listaAeropuerto = new Aeropuerto().leerRegistrosBD();
		
		List<Hotel> listaHotel = new ArrayList<Hotel>();
		listaHotel = new Hotel().leerRegistrosBD();
		
		List<Avion> listaAvion = new ArrayList<Avion>();
		listaAvion = new Avion().leerRegistrosBD();
		
		DefaultComboBoxModel model1 = new DefaultComboBoxModel(listaAeropuerto.toArray());
		cbxAeropuertoOrigen = new JComboBox(model1);
		if(cbxAeropuertoOrigen.getItemCount()> 0) cbxAeropuertoOrigen.setSelectedIndex(0);
		cbxAeropuertoOrigen.setMaximumSize((new Dimension(250,25)));
		
		DefaultComboBoxModel model2 = new DefaultComboBoxModel(listaAeropuerto.toArray());	
		cbxAeropuertoDestino = new JComboBox(model2);
		if(cbxAeropuertoDestino.getItemCount()> 0) cbxAeropuertoDestino.setSelectedIndex(1);
		cbxAeropuertoDestino.setMaximumSize((new Dimension(250,25)));
		
		DefaultComboBoxModel model3 = new DefaultComboBoxModel(listaHotel.toArray());	
		cbxHotel = new JComboBox(model3);
		if(cbxHotel.getItemCount()> 0) cbxHotel.setSelectedIndex(0);
		cbxHotel.setMaximumSize((new Dimension(250,25)));
		
		DefaultComboBoxModel model4 = new DefaultComboBoxModel(listaAvion.toArray());	
		cbxAvion = new JComboBox(model4);
		if(cbxAvion.getItemCount()> 0) cbxAvion.setSelectedIndex(0);
		cbxAvion.setMaximumSize((new Dimension(250,25)));
	}
	boolean validarPaquete(){
		try {
			Validador.validarFecha(txtFechaIda.getText(), "Fecha Ida");
			Validador.validarHora(txtHoraSalida.getText(), "Hora Ida");
			Validador.validarFecha(txtFechaVuelta.getText(), "Fecha Vuelta");
			Validador.validarHora(txtHoraLlegada.getText(), "Hora Vuelta");	
			Validador.validarNumero(txtPrecio.getText(), "Precio");	
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), null, JOptionPane.ERROR_MESSAGE);
			return false;
		}
		return true;
	}
	
	void guardarPaquete() throws IOException, ClassNotFoundException{
			PaqueteDeViaje pdv = new PaqueteDeViaje();
			pdv.setIdPaquete(pdv.codigoUltimoRegistro());		
			pdv.setFechaSalida(txtFechaIda.getText());		
			pdv.setFechaArrivo(txtFechaVuelta.getText());			
			pdv.setHoraSalida(txtHoraSalida.getText());
			pdv.setHoraArrivo(txtHoraLlegada.getText());			
			pdv.setAeropuertoSalida((Aeropuerto) cbxAeropuertoOrigen.getSelectedItem());
			pdv.setAuropuertaArrivo((Aeropuerto) cbxAeropuertoDestino.getSelectedItem());		
			pdv.setHotel((Hotel) cbxHotel.getSelectedItem());
			pdv.setAvion((Avion) cbxAvion.getSelectedItem());
			pdv.setPrecio(Float.parseFloat(txtPrecio.getText()));
			
			
			try {
				pdv.guardarRegistro();
			} catch (IOException e) {
				e.printStackTrace();
			}
			JOptionPane.showMessageDialog(null, "Paquete cargado!", null, JOptionPane.INFORMATION_MESSAGE);
			MenuAgregarPaquete.this.dispose();	
	}
}
